package org.aerie.forest.core.frame.rebar.entity.bootable;

import java.time.LocalDateTime;

/**
 * @description 启动器
 *
 * @author quark
 * @organization aerie
 * @date 2020年2月20日 下午5:37:28
 * @version 1.2.0
 */
public interface BootProcessor {

	/**
	 * @description 可执行功能
	 *
	 * @author quark
	 * @organization aerie
	 * @date 2020年2月20日 下午5:37:41
	 * @version 1.2.0
	 */
	@FunctionalInterface
	interface RunnableFunction {

		/**
		 * @description 执行
		 * @throws Exception 执行的自定义异常
		 *
		 * @date 2020年2月20日 下午5:37:53
		 * @version 1.2.0
		 */
		public void action() throws Exception;
	}

	/**
	 * @description 允许启动判断
	 * @return 是否允许启动
	 *
	 * @date 2020年2月21日 下午1:30:31
	 * @version 1.2.0
	 */
	boolean allowStart();

	/**
	 * @description 开始运行
	 * @throws Exception 运行的自定义异常
	 *
	 * @date 2020年2月21日 下午1:30:55
	 * @version 1.2.0
	 */
	void run() throws Exception;

	/**
	 * @description 停止运行
	 * @throws Exception 停止运行的自定义异常
	 *
	 * @date 2020年2月21日 下午1:36:05
	 * @version 1.2.0
	 */
	void close() throws Exception;

	/**
	 * @description 判断是否已经启动
	 * @return 是否启动标识
	 *
	 * @date 2020年2月21日 下午1:36:57
	 * @version 1.2.0
	 */
	boolean hasStarted();

	/**
	 * @description 获得启动的时间
	 * @return 启动的时间
	 *
	 * @date 2020年2月21日 下午2:02:15
	 * @version 1.2.0
	 */
	LocalDateTime getStartTime();

	/**
	 * @description 是否运行时存在异常
	 * @return 运行异常标识符
	 *
	 * @date 2020年2月21日 下午2:06:50
	 * @version 1.2.0
	 */
	boolean hasException();

	/**
	 * @description 获得最后一个根本异常
	 * @return 最后一个根本异常
	 *
	 * @date 2020年2月21日 下午2:07:50
	 * @version 1.2.0
	 */
	Exception getLastPrimaryException();

	/**
	 * @description 获得异常产生的时间
	 * @return 异常产生的时间
	 *
	 * @date 2020年2月21日 下午2:09:29
	 * @version 1.2.0
	 */
	LocalDateTime getLastExceptionTime();

	/**
	 * @description 分析异常集合
	 *
	 * @date 2020年2月21日 下午2:09:45
	 * @version 1.2.0
	 */
	void analyzeExceptions();

	/**
	 * @description 启动的线程是否活跃
	 * @return 线程活跃标识符
	 *
	 * @date 2020年2月21日 下午2:09:57
	 * @version 1.2.0
	 */
	boolean isAlive();
}
